﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Collections;
using System.Reflection;

namespace VectorFluffy
{
    /// <summary>
    /// Класс с удобными методами работы с XML
    /// </summary>
    internal class XmlHelper
    {
        /// <summary>
        /// Простая функция создания аттрибутов XML для ветви
        /// </summary>
        /// <param name="node">Ветвь</param>
        /// <param name="name">Имя</param>
        /// <param name="value">Значение</param>
        /// <returns>Аттрибут</returns>
        public static void CreateXmlAttr(XmlNode node, string name, string value)
        {
            XmlAttribute attr = node.OwnerDocument.CreateAttribute(name);
            attr.Value = value;
            node.Attributes.Append(attr);
        }

        /// <summary>
        /// Заполнить все свойства из ветви props
        /// Работает для ветвей с тегом "prop", остальные игнорируются
        /// Игнорируемые ветви должен обработать сам элемент в методе LoadAdditionals(...)
        /// </summary>
        /// <param name="obj">Объект</param>
        /// <param name="props">Ветвь свойств</param>
        public static void PostPropsToObject(object obj, XmlNode props)
        {
            Type t = obj.GetType();
            for (int i = 0; i < props.ChildNodes.Count; i++)
            {
                if (props.ChildNodes[i].Name == "prop")
                {
                    XmlNode p = props.ChildNodes[i];
                    PropertyInfo pinf = t.GetProperty(p.Attributes["name"].Value);
                    string prop_value = p.Attributes["value"].Value;
                    object p_val = Convert.ChangeType(prop_value, pinf.PropertyType);
                    pinf.SetValue(obj, p_val, null);
                }
            }
        }

        /// <summary>
        /// Сохраняет список свойств
        /// </summary>
        /// <param name="doc">Xml документ</param>
        /// <param name="parent">Ветвь свойств</param>
        /// <param name="table">Значения</param>
        public static void SaveProps(XmlNode parent, Hashtable table)
        {
            XmlDocument doc = parent.OwnerDocument;
            XmlNode item = null;
            IDictionaryEnumerator enumer = table.GetEnumerator();
            while (enumer.MoveNext())
            {
                item = doc.CreateElement("prop");
                CreateXmlAttr(item, "name", enumer.Key.ToString());
                CreateXmlAttr(item, "value", enumer.Value.ToString());
                parent.AppendChild(item);
            }
        }
    }
}